package org.example.projecttwo.service.Iuser;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.example.projecttwo.entity.dto.auth.LoginDTO;
import org.example.projecttwo.entity.dto.auth.LoginVO;
import org.example.projecttwo.entity.dto.auth.RegisterDTO;
import org.example.projecttwo.entity.dto.common.BatchDeleteUserDTO;
import org.example.projecttwo.entity.dto.common.BatchUpdateUserStatusDTO;
import org.example.projecttwo.entity.dto.common.DeleteUserDTO;
import org.example.projecttwo.entity.dto.user.request.ChangePasswordDTO;
import org.example.projecttwo.entity.dto.user.request.UpdatePersonalityDTO;
import org.example.projecttwo.entity.dto.user.request.UpdateProfileDTO;
import org.example.projecttwo.entity.dto.user.response.UserExportDTO;
import org.example.projecttwo.entity.enums.PointActionEnum;
import org.example.projecttwo.entity.user.User;

import java.util.List;

/**
 * <p>
 * 用户基础信息表 服务类
 * </p>
 *
 * @author nn
 * @since 2025-11-01
 */
public interface IUserService extends IService<User> {

    /**
     * 用户注册
     * @param dto 注册信息
     */
    void register(RegisterDTO dto);

    /**
     * 用户登录
     * @param dto 登录信息
     * @return 登录结果
     */
    LoginVO login(LoginDTO dto);

    /**
     * 分页查询用户列表
     * @param page 分页参数
     * @param keyword 昵称查询
     * @param status 账号状态筛选：0-启用,1-禁用,2-冻结
     * @param authType 认证类型筛选：0-个人 1-学生组织 2-学院部门 3-学校官方
     * @param role 角色筛选：0-管理员 1-普通用户
     * @param collegeId 学院ID筛选
     * @return 分页结果
     */
    IPage<User> pageBy(Page<User> page, String keyword, Integer status, Integer authType, Integer role, String collegeId);

    /**
     * 获取当前用户信息 -- 用户页
     * @return 当前用户信息
     */
    User getCurrentUser();

    /**
     * 更新当前用户信息 -- 用户页
     * @param userDto 用户信息
     */
    void updateCurrentUser(UpdatePersonalityDTO userDto);

    /**
     * 更新当前用户[更多信息] -- 用户页
     */
    void updateProfile(UpdateProfileDTO dto);

    /**
     * 修改当前用户密码
     */
    void changePassword(ChangePasswordDTO dto);

    /**
     * 更新用户状态 -- 管理页
     * @param id 用户ID
     * @param status 状态: 0-启用,1-禁用,2-冻结
     */
    void updateUserStatus(Long id, Integer status);

    /**
     * 重置用户密码 -- 管理页
     * @param id 用户ID
     */
    void resetUserPassword(Long id);

    /**
     * 删除用户 -- 管理页
     * @param id 用户ID
     * @param deleteDto 删除信息
     */
    void deleteUser(Long id, DeleteUserDTO deleteDto);
    
    /**
     * 创建用户 -- 管理页
     * @param user 用户信息
     * @return 创建后的用户信息
     */
    User createUser(User user);

    /**
     * 更新用户信息 -- 管理页
     * @param user 用户信息
     * @return 更新后的用户信息
     */
    User updateUser(User user);

    /**
     * 批量更新用户状态 -- 管理页
     * @param dto 批量更新状态信息
     */
    void batchUpdateUserStatus(BatchUpdateUserStatusDTO dto);

    /**
     * 批量删除用户 -- 管理页
     * @param dto 批量删除信息
     */
    void batchDeleteUser(BatchDeleteUserDTO dto);

    /**
     * 批量导出用户 -- 管理页
     * @param ids 用户ID列表
     * @return 导出的用户列表
     */
    List<UserExportDTO> batchExportUser(List<Long> ids);

    /**
     * 导出当前用户信息 -- 个人页
     * @return 导出的当前用户信息
     */
    UserExportDTO exportCurrentUser();

    /**
     * 切换用户状态 -- 管理页
     * @param id 用户ID
     * @param status 状态: 0-启用,1-禁用,2-冻结
     */
    void switchUserStatus(Long id, Integer status);

    /**
     * 切换用户角色 -- 管理页
     * @param id 用户ID
     * @param roleCode 角色编码: 0-普通用户,1-管理员,2-超级管理员
     */
    void switchUserRole(Long id, Integer roleCode);

    /**
     * 调整用户积分 -- 管理页
     * @param id 用户ID
     * @param type 调整类型: 1-增加 2-减少
     * @param value 调整值
     */
    void adjustUserPoints(Long id, Integer type, Integer value);

    /**
     * 根据积分行为调整用户积分
     * @param userId 用户ID
     * @param action 积分行为
     */
    void adjustUserPointsByAction(Long userId, PointActionEnum action);
}